﻿using System;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using RA_WebSite.Models;

namespace RA_WebSite.Controllers
{
    public class StepController : Controller
    {
        private RAContext db = new RAContext();

        //
        // GET: /Step/

        public ActionResult Index()
        {
            var steps = db.Steps.Include(s => s.Campione);
            return View(steps.ToList());
        }

        //
        // GET: /Step/Details/5

        public ActionResult Details(int idCampione = 0, int id = 0)
        {
            Step step = db.Steps.Find(id);
            if (step == null)
            {
                return HttpNotFound();
            }
            ViewBag.Campione_Id = new SelectList(db.Campiones, "Id", "Descrizione", step.Campione_Id);
            ViewBag.CampioneSelezionatoID = idCampione;
            return View(step);
        }

  

        //
        // GET: /Step/Create

        public ActionResult Create(Campione c)
        {
            ViewBag.Campione_Id = new SelectList(db.Campiones, "Id", "Descrizione");
            ViewBag.CampioneSelezionatoID = c.Id;
            ViewBag.CampioneSelezionatoNome = c.Descrizione;
            return View();
        }

        //
        // POST: /Step/Create

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Step step, HttpPostedFileBase FotoForm)
        {

            Byte[] data = new Byte[FotoForm.ContentLength];
            FotoForm.InputStream.Read(data, 0, FotoForm.ContentLength);
            FotoForm.InputStream.Position = 0;
            //var target = new MemoryStream();
            //var httpPostedFileBase = Request.Files["FotoForm"];
            //if (httpPostedFileBase != null) httpPostedFileBase.InputStream.CopyTo(target);
            //byte[] data = target.ToArray();

            // Faccio il resize
            var immagineTemp = RidimensionaImmagine.ByteArrayToImage(data);
            var altezzaMax = 600;
            if (immagineTemp.Height > altezzaMax || immagineTemp.Width > altezzaMax)
            {
                if (immagineTemp.Width > immagineTemp.Height)
                {
                    var nuovaAltezza = (immagineTemp.Height * altezzaMax) / immagineTemp.Width;
                    data = RidimensionaImmagine.CreateThumbnail(data, nuovaAltezza);
                }
                else
                {
                    data = RidimensionaImmagine.CreateThumbnail(data, altezzaMax);
                }    
            }
            
            step.Foto = data;

            //ModelState.Clear();
            //TryValidateModel(step);

            if (ModelState.IsValid)
            {
                db.Steps.Add(step);
                db.SaveChanges();
                return RedirectToAction("ListStepCampione", new { id = step.Campione_Id });
            }

            ViewBag.Campione_Id = new SelectList(db.Campiones, "Id", "Descrizione", step.Campione_Id);
            ViewBag.CampioneSelezionatoID = step.Campione_Id;
            var campioneDescrione = (db.Campiones.Where(c => c.Id == step.Campione_Id)).FirstOrDefault();
            ViewBag.CampioneSelezionatoNome = campioneDescrione.Descrizione;
            return View(step);
        }

        //
        // GET: /Step/Edit/5

        public ActionResult Edit(int idCampione=0, int id = 0)
        {
            Step step = db.Steps.Find(id);
            if (step == null)
            {
                return HttpNotFound();
            }
            ViewBag.Campione_Id = new SelectList(db.Campiones, "Id", "Descrizione", step.Campione_Id);
            ViewBag.CampioneSelezionatoID = idCampione;
            return View(step);
        }

        //
        // POST: /Step/Edit/5

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(Step step)
        {
            if (ModelState.IsValid)
            {
                db.Entry(step).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("ListStepCampione", new { id = step.Campione_Id });
            }
            ViewBag.Campione_Id = new SelectList(db.Campiones, "Id", "Descrizione", step.Campione_Id);
            return View(step);
        }

        //
        // GET: /Step/Delete/5
        public ActionResult Delete(int idCampione=0, int id = 0)
        {
            Step step = db.Steps.Find(id);
            if (step == null)
            {
                return HttpNotFound();
            }
            ViewBag.CampioneSelezionatoID = idCampione;
            return View(step);
        }

        //
        // POST: /Step/Delete/5

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {

            var data = (from s in db.Steps
                        where s.Id == id
                        select new
                        {
                            id = s.Campione_Id
                        }).FirstOrDefault();     

            Step step = db.Steps.Find(id);
            db.Steps.Remove(step);
            db.SaveChanges();
            //step = db.Steps.Where(c => c.Campione_Id == id).FirstOrDefault();
            return RedirectToAction("ListStepCampione", new { id = data.id });
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        //
        // GET: /Step/ListStepCampione/5

        public ActionResult ListStepCampione(int id = 0)
        {
            var data = db.Steps.Where(s => s.Campione_Id == id);
            //var campioneAssociatoAlloStep = (from s in db.Steps where s.Campione_Id == id select s).FirstOrDefault();


            var campioneAssociatoAlloStep = db.Campiones.Where(c => c.Id == id).FirstOrDefault();
            ViewBag.CampioneAssociato = campioneAssociatoAlloStep;
            return View(data.ToList());
        }

        // To convert the Byte Array to the author Image
        public FileContentResult getImg(int id)
        {
            byte[] byteArray = db.Steps.Find(id).Foto;

            //TextWriter tw = new StreamWriter(@"C:\Users\Public\WriteLines.txt", true);
            //foreach (var b in byteArray)
            //{

            //    tw.Write(b.ToString());

            //    //System.IO.File.AppendText(@"C:\Users\Public\WriteLines.txt", b.ToString());
            //}
            //tw.Flush();
           

            if (byteArray != null)
            {
                return new FileContentResult(byteArray, "image/jpeg");
            }
            else
            {
                return null;
            }
        }

        //
        // GET: /Step/Analisi/5

        public ActionResult AnalisiStep(int id = 0)
        {
            Step step = db.Steps.Find(id);
            if (step == null)
            {
                return HttpNotFound();
            };
            var a=ElaboraAnalisi.EseguiAnalisiStep(step);
            ViewBag.stepSelezionato = step;
            return View(a);

        }

    }
}